package com.atguigu.tingshu.album.service.impl;

import com.atguigu.tingshu.album.service.TestService;
import com.atguigu.tingshu.common.util.RandomUtil;
import io.netty.handler.ssl.util.FingerprintTrustManagerFactory;
import org.apache.commons.lang3.StringUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * ClassName: TestServiceImpl
 * Package: com.atguigu.tingshu.album.service.impl
 * Description:
 *
 * @Author ycy
 * @Create 2024/9/26 10:34
 * @Version 1.0
 */
@Service
public class TestServiceImpl implements TestService {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private RedissonClient redissonClient;


    @Override
    public void testLock() {

        // 0.1 创建锁对象
        RLock lock = redissonClient.getLock("lock");

        // 0.2 获取锁
        // 0.2.1 一直等待到获取锁，如果获取锁成功，锁有效时间为：30s，底层启动看门狗线程（延时锁的超时时间）
        lock.lock();

        String uuid = UUID.randomUUID().toString();

        try {
        //1.从Redis缓存中获取key="num"的值  保证redis中存在"num"(手动提前在redis中创建key)
                String value = stringRedisTemplate.opsForValue().get("num");
            if (StringUtils.isBlank(value)) {
                return;
            }
            //2.对获取到值进行+1操作
            // 将获取的字符串转化为 int
            int num = Integer.parseInt(value);
            stringRedisTemplate.opsForValue().set("num", String.valueOf/*将对象转化为字符串*/(++num));
        } catch (NumberFormatException e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }


                // 执行脚本参数： 参数1：脚本对象封装 lua 脚本，参数2：lua脚本中需要的key参数（KEY[i]），
                // 参数3：lua脚本需要的参数 ARGV[i]
                // 4.1 创建脚本对象 DefaultRedisScript 泛型脚本语言返回值类型 Long 0：失败 1：成功
//                DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
                // 4.2 设置脚本文本
//                String script = "if redis.call(\"get\",KEYS[1]) == ARGV[1]\n" +
//                        "then\n" +
//                        "    return redis.call(\"del\",KEYS[1])\n" +
//                        "else\n" +
//                        "    return 0\n" +
//                        "end";
//                redisScript.setScriptText(script);
//                // 4.3 设置响应类型
//                redisScript.setResultType(Long.class);
//                stringRedisTemplate.execute(redisScript, Arrays.asList("lock"),uuid);


    }
}
